package services

import (
	"context"
	"sync"
	"time"
)

// 标准服务接口
type Service interface {
	// 发送消息
	SendAll(msg []byte) bool
	// 开始服务
	Start()
	Close()
	SetContext(ctx *context.Context)
	Reload()
}

type HttpConfig struct {
	Enable   bool
	TimeTick int //故障检测的时间间隔，单位为秒
	Nodes    [][]string
}

type HttpService struct {
	Service
	nodes            []*httpNode      // 客户端分组，现在支持两种分组，广播组合负载均衡组
	lock             *sync.Mutex      // 互斥锁，修改资源时锁定
	sendFailureTimes int64            // 发送失败次数
	enable           bool             //
	timeTick         time.Duration    // 故障检测的时间间隔
	ctx              *context.Context //
	wg               *sync.WaitGroup  //
	clientsCount     int              //
}

type httpNode struct {
	url              string      // url
	sendQueue        chan string // 发送channel
	sendTimes        int64       // 发送次数
	sendFailureTimes int64       // 发送失败次数
	offline          bool        // 是否因为故障下线的节点
	failureTimesFlag int32       // 发送失败次数，用于配合last_error_time检测故障，故障定义为：连续三次发生错误和返回错误
	lock             *sync.Mutex // 互斥锁，修改资源时锁定
	cache            [][]byte    //
	cacheIndex       int         //
	cacheIsInit      bool        //
	cacheFull        bool        //
	errorCheckTimes  int64       //
}

const (
	HTTP_MAX_SEND_QUEUE    = 1000000 //100万缓冲区
	HTTP_CACHE_LEN         = 1000000
	HTTP_CACHE_BUFFER_SIZE = 4096
	HTTP_POST_TIMEOUT      = 3   //3秒超时
	DEFAULT_LOGIN_TIMEOUT  = 600 //600秒不活动，登录超时
)
